home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-02-09 | 36.4 KB | 1,796 lines |
- (* module FioAsm
-
-
- File input-output routines for JPI Modula-2, version 2
- by Carl Neiburger
- 169 N. 25th St.
- San Jose, Calif. 95116
-
- CompuServe No. 72336,2257
-
- These routines are intended to replace low-level routines in JPI's FIO.MOD.
- FioAsm's routines are optimized through assembly language.
-
- *)
-
- sameCS = 1 - ( (model / 1) & 1 )
- sameDS = 1 - ( (model / 2) & 1 )
- LongAddr = ( (model / 4) & 1 ) | ( (model / 2) & 1 )
- RegParam = (model / 16) & 1
- (*%F sameCS *)
- frame = 4
- (*%E *)
- (*%T sameCS *)
- frame = 2
- (*%E *)
- module FioAsm
-
- section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H);
- group DGROUP(_BSS)
-
- select _BSS
- public FioAsm@path: org 65
- select _TEXT
-
- public FioAsm$ToPath: (* on entry, ds:si are string to copy *)
- push es; push di (* and cx is length *)
- cmp cx, 64 (* is string too long? *)
- jb ToPath1
- mov cx, 64 (* then truncate *)
- ToPath1:
- mov bx, seg FioAsm@path
- mov es, bx
- mov di,FioAsm@path
- xor al,al (* search for 0 *)
- repne
- movsb (* move it *)
- (*%T LongAddr *)
- mov ds, bx
- (*%E *)
- mov dx,FioAsm@path
- mov byte [di],0 (* add zero *)
- ToPath2:
- pop di; pop es
- ret near 0
-
- section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H);
- group DGROUP(_BSS)
-
- select _TEXT
- public FioAsm@IOR: dw 0
-
- public FioAsm$SetIorBool :
- jnc SetOK
- mov cs:[FioAsm@IOR],ax
- xor ax, ax
- ret near 0
- SetOK:
- mov word cs:[FioAsm@IOR],0
- mov ax, 1
- ret near 0
-
- public FioAsm$IOresult:
- mov ax, cs:[FioAsm@IOR]
- mov word [FioAsm@IOR],0
- (*%F sameCS *)
- ret far 0
- (*%E *)
- (*%T sameCS *)
- ret near 0
- (*%E *)
-
- section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
- select _TEXT
-
- extrn FioAsm@IOR
- extrn FioAsm$ToPath
-
- public FioAsm$Create :
- (*%T RegParam *)
- RetSize = 0 (* AX = Len; BX = Ofs = 8; CX = Seg *)
- (*%E *)
- (*%F RegParam *)
- (*%T LongAddr *)
- RetSize = 6
- NameLen = frame+6; NameSeg = frame+4; NameOfs = frame+2;
- (*%E *)
- (*%F LongAddr *)
- RetSize = 4
- NameLen = frame+4; NameOfs = frame+2;
- (*%E *)
- push bp; mov bp,sp
- (*%E *) (* F RegParam *)
- push si
- push dx
- (*%T LongAddr *)
- push ds
- (*%T RegParam *)
- mov ds, cx
- (*%E *)
- (*%F RegParam *)
- lds si, [bp][NameOfs]
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- (*%F LongAddr *)
- mov si, [bp][NameOfs]
- (*%E *)
- mov cx, [bp][NameLen]
- (*%E *)
- (*%T RegParam *)
- mov si, bx
- mov cx, ax
- (*%E *)
- call near FioAsm$ToPath
- mov ah, 3CH (* create file *)
- xor cx, cx (* no attribute *)
- int 21H
- jnc CrRet (* handle is in ax *)
- mov cs:[FioAsm@IOR],ax (* error is in ax *)
- xor ax,ax
- not ax (* return MAX(CARDINAL) *)
- CrRet:
- (*%T LongAddr *)
- pop ds
- (*%E *)
- pop dx
- pop si
- (*%F RegParam *)
- pop bp;
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
- select _TEXT
-
- extrn FioAsm@IOR
- extrn FioAsm$ToPath
-
- public FioAsm$Open : (* AX=Len; BX=Ofs; CX=Seg; CX/DX=Type *)
- (*%T RegParam *)
- RetSize = 0 (* AX=Len; BX=Ofs; CX=Seg; CX/DX=Type *)
- (*%E *)
- (*%F RegParam *)
- (*%T LongAddr *)
- RetSize = 8;
- NameLen = frame+8; NameSeg = frame+6;
- NameOfs = frame+4; Type = frame+2;
- (*%E *)
- (*%F LongAddr *)
- RetSize = 6;
- NameLen = frame+6;
- NameOfs = frame+4; Type = frame+2;
- (*%E *)
- push bp; mov bp,sp
- (*%E *)
- push si
- push dx
- (*%T RegParam *)
- (*%T LongAddr *)
- push ds
- mov ds, cx
- push dx (* save type *)
- (*%E *)
- (*%F LongAddr *)
- push cx (* save type *)
- (*%E *)
- mov si, bx
- mov cx, ax
- (*%E *) (* RegParam *)
- (*%F RegParam *)
- (*%T LongAddr *)
- push ds
- lds si, [bp][NameOfs]
- (*%E *)
- (*%F LongAddr *)
- mov si, [bp][NameOfs]
- (*%E *)
- mov cx, [bp][NameLen]
- (*%E *) (* F RegParam *)
- call near FioAsm$ToPath
- (*%T RegParam *)
- pop ax (* put type in AL *)
- (*%E *) (* RegParam *)
- (*%F RegParam *)
- mov al, [bp][Type]
- (*%E *) (* F RegParam *)
- mov ah, 3DH (* open file *)
- int 21H
- jnc Ret (* handle is in ax *)
- mov cs:[FioAsm@IOR],ax (* error is in ax *)
- xor ax,ax
- not ax (* return MAX(CARDINAL) *)
- Ret:
- (*%T LongAddr *)
- pop ds
- (*%E *)
- pop dx
- pop si
- (*%F RegParam *)
- pop bp;
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
- select _TEXT
-
- extrn FioAsm$SetIorBool
-
- public FioAsm$Close :
- (*%F RegParam *)
- handle = frame+2; RetSize = 2
- push bp; mov bp,sp
- mov bx, [bp][handle]
- (*%E *)
- push dx
- (*%T RegParam *)
- RetSize = 0
- mov bx, ax (* AX = handle *)
- (*%E *)
- mov ah, 3EH (* close file *)
- int 21H
- call near FioAsm$SetIorBool
- pop dx
- (*%F RegParam *)
- pop bp
- (*%E *) (* F RegParam *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- extrn FioAsm$SetIorBool
-
- public FioAsm$Truncate :
- (*%F RegParam *)
- handle = frame+2; RetSize = 2
- push bp; mov bp,sp
- mov bx, [bp][handle]
- (*%E *)
- (*%T RegParam *)
- RetSize = 0
- mov bx, ax (* AX = handle *)
- (*%E *)
- push dx
- mov ah, 40H (* write *)
- xor cx, cx
- int 21H
- call near FioAsm$SetIorBool
- pop dx
- (*%F RegParam *)
- pop bp
- (*%E *) (* F RegParam *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
- select _TEXT
-
- extrn FioAsm@IOR
-
- public FioAsm$Read :
- (*%F RegParam *)
- push bp; mov bp,sp
- push dx
- (*%T LongAddr *)
- handle = frame+10; BufLen = frame+8;
- BufSeg = frame+6; BufOfs = frame+4; Count = frame+2;
- RetSize = 10
- push ds;
- lds dx, [bp][BufOfs]
- (*%E *)
- (*%F LongAddr *)
- handle = frame+8; BufLen = frame+6;
- BufOfs = frame+4; Count = frame+2;
- RetSize = 8
- mov dx, [bp][BufOfs]
- (*%E *)
- mov cx, [bp][Count]
- mov bx, [bp][handle]
- (*%E *)
- (*%T RegParam *) (*AX=handle; BX=Len; CX=Ofs; DX=Seg; DX/f+6=count*)
- (*%T LongAddr *)
- RetSize = 2 (* calling procedure pops *)
- Count = frame + 2;
- push bp; mov bp,sp
- push dx
- push ds;
- mov ds, dx (* DX = offset *)
- mov dx, cx (* make DX offset *)
- mov cx, [bp][Count]
- (*%E *)
- (*%F LongAddr *)
- RetSize = 0 (* calling procedure pops *)
- push dx
- xchg cx, dx (* make DX offset, CX count *)
- (*%E *)
- mov bx, ax
- (*%E *)
- mov ah, 3FH (* read file *)
- int 21H
- jnc ReRet (* bytes read are ax *)
- mov cs:[FioAsm@IOR],ax (* error is in ax *)
- xor ax,ax (* if error, return zero *)
- ReRet:
- (*%T LongAddr *)
- pop ds
- (*%E *)
- pop dx
- (*%T RegParam *)
- (*%T LongAddr *)
- pop bp
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
- select _TEXT
-
- extrn FioAsm@IOR
-
- public FioAsm$Write :
- (*%T RegParam *)(* AX= handle; BX=Len; CX=Ofs; DX=Seg; DX/f+2= Count*)
- (*%T LongAddr *)
- RetSize = 2 (* calling procedure pops *)
- Count = frame+2
- push bp; mov bp,sp
- (*%E *)
- (*%F LongAddr *)
- RetSize = 0 (* calling procedure pops *)
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- (*%T LongAddr *)
- RetSize = 10; handle = frame+10; BufLen = frame+8;
- BufSeg = frame+6; BufOfs = frame+4; Count = frame+2;
- (*%E *)
- (*%F LongAddr *)
- RetSize = 8; handle = frame+8; BufLen = frame+6;
- BufOfs = frame+4; Count = frame+2;
- (*%E *)
- push bp; mov bp,sp
- (*%E *)
- push dx
- (*%T LongAddr *)
- push ds
- (*%T RegParam *)
- mov ds, dx (* segment *)
- mov dx, cx (* offset *)
- (*%E *)
- (*%F RegParam *)
- lds dx, [bp][BufOfs]
- (*%E *)
- mov cx, [bp][Count]
- (*%E *)
- (*%F LongAddr *)
- (*%T RegParam *)
- xchg cx, dx (* make DX offset, CX count *)
- (*%E *)
- (*%F RegParam *)
- mov dx, [bp][BufOfs]
- mov cx, [bp][Count]
- (*%E *)
- (*%E *)
- (*%T RegParam *)
- mov bx, ax (* handle *)
- (*%E *)
- (*%F RegParam *)
- mov bx, [bp][handle]
- (*%E *)
- mov ah, 40H (* write file *)
- int 21H
- jnc WrRet (* bytes written are in ax *)
- mov cs:[FioAsm@IOR],ax (* error is in ax *)
- xor ax,ax (* if error, return zero *)
- WrRet:
- (*%T LongAddr *)
- pop ds
- (*%E *)
- pop dx
- (*%T RegParam *)
- (*%T LongAddr *)
- pop bp
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- extrn FioAsm$SetIorBool
- extrn FioAsm$ToPath
-
- public FioAsm$Rename :
- RegsToPop = 6; SaveOldLen = -8
- (*%T RegParam *) (*AX=OldLen; BX=OldOfs *)
- (*%T LongAddr *) (* CX=OldSeg; DX=NewLen *)
- RetSize = 4
- NewSeg=frame+4; NewOfs=frame+2;
- (*%E *)
- (*%F LongAddr *)(* CX=NewLen DX=NewOfs *)
- RetSize = 0
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- (*%T LongAddr *)
- OldLen = frame+12; OldSeg = frame+10; OldOfs = frame+8;
- NewLen = frame+6; NewSeg = frame+4; NewOfs = frame+2;
- RetSize = 12
- (*%E *)
- (*%F LongAddr *)
- OldLen = frame+8; OldOfs = frame+6;
- NewLen = frame+4; NewOfs = frame+2; RetSize = 8
- (*%E *)
- (*%E *)
- push bp; mov bp,sp
- push si; push di;
- (*%F LongAddr *)
- push dx
- (*%E *)
- (*%T LongAddr *)
- push ds;
- lds si,[bp][NewOfs]
- (*%T RegParam *)
- xchg cx,dx (* CX= NewLen; DX = OldSeg *)
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- mov cx,[bp][NewLen]
- (*%E *)
- (*%F LongAddr *)
- (*%T RegParam *)
- mov si, dx (* NewOfs; CX already = NewLen *)
- (*%E *)
- (*%F RegParam *)
- mov si, [bp][NewOfs]
- (*%E *)
- (*%E *)
- (*%T RegParam *)
- push ax (* save OldLen *)
- (*%E *)
- xor ax, ax
- push ax (* zero to terminate string *)
- sub sp,cx (* make room for string *)
- mov di, ss
- mov es, di
- mov di,sp
- rep
- movsb (* move it *)
- mov di,sp (* point back to string start *)
- (*%T RegParam *)
- (*%T LongAddr *)
- mov ds, dx (* OldSeg *)
- (*%E *)
- mov si, bx (* OldOfs *)
- mov cx, [bp][SaveOldLen](* OldLen *)
- (*%E *)
- (*%F RegParam *)
- (*%T LongAddr *)
- lds si, [bp][OldOfs]
- (*%E *)
- (*%F LongAddr *)
- mov si, [bp][OldOfs]
- (*%E *)
- mov cx, [bp][OldLen]
- (*%E *)
- call near FioAsm$ToPath (* point ds:dx to old name *)
- mov ah, 56H (* rename *)
- int 21H
- call near FioAsm$SetIorBool
- mov sp, bp (* restore stack pointer *)
- sub sp, RegsToPop (* except for following 3 or 4 words *)
- (*%T LongAddr *)
- pop ds
- (*%E *)
- (*%F LongAddr *)
- pop dx
- (*%E *)
- pop di; pop si
- pop bp;
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
- (* NO ARGUMENTS *)
- public FioAsm$GetDrive:
- mov ah, 19H (* get drive *)
- int 21H
- inc al (* bump A up to 1, etc *)
- (*%F sameCS *)
- ret far 0
- (*%E *)
- (*%T sameCS *)
- ret near 0
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- extrn FioAsm$GetDrive
-
- (* NO ARGUMENTS *)
- public FioAsm$Drives:
- push dx
- (*%F sameCS *)
- call far FioAsm$GetDrive
- (*%E *)
- (*%T sameCS *)
- call near FioAsm$GetDrive
- (*%E *)
- dec al (* A = 0 in this case *)
- mov dl, al
- mov ah, 0EH (* number of drives *)
- int 21H
- pop dx
- (*%F sameCS *)
- ret far 0
- (*%E *)
- (*%T sameCS *)
- ret near 0
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- extrn FioAsm$Drives
- extrn FioAsm$SetIorBool
-
- public FioAsm$SetDrive:
- (*%F RegParam *)
- drive = frame+2; RetSize = 2
- push bp; mov bp,sp
- push dx
- (*%E *)
- (*%T RegParam *) (* AX = drive *)
- RetSize = 0
- push dx
- push ax (* save drive *)
- (*%E *)
- (*%F sameCS *)
- call far FioAsm$Drives (* how many are there? *)
- (*%E *)
- (*%T sameCS *)
- call near FioAsm$Drives (* how many are there? *)
- (*%E *)
- (*%T RegParam *)
- pop dx (* retrieve drive *)
- (*%E *)
- (*%F RegParam *)
- mov dl, [bp][drive]
- (*%E *)
- cmp al,dl (* does requested drive exist? *)
- jl SDerr (* if so, forget it *)
- mov ah, 0EH (* set drive *)
- dec dl
- int 21H
- clc
- jmp SDret
- SDerr:
- mov ax,15
- stc
- SDret:
- call near FioAsm$SetIorBool
- pop dx
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- public FioAsm$SetVerify:
- (*%T RegParam *) (* AL = SVon *)
- RetSize = 0
- (*%E *)
- (*%F RegParam *)
- RetSize = 2
- SVon = frame+2
- push bp; mov bp,sp
- mov al, [bp][SVon]
- (*%E *)
- push dx
- xor dl, dl
- mov ah, 2EH
- int 21H
- pop dx
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- (* NO ARGUMENTS *)
- public FioAsm$VerifyIsOn:
- mov ah, 54H (* number of drives *)
- int 21H
- (*%F sameCS *)
- ret far 0
- (*%E *)
- (*%T sameCS *)
- ret near 0
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- extrn FioAsm$SetIorBool
- extrn FioAsm$ToPath
-
- public FioAsm$SetFileAttribute :
- (*%F RegParam *)
- (*%T LongAddr *)
- Attr = frame+8; FNLen = frame+6; FNSeg = frame+4; FNOfs = frame+2;
- RetSize = 8
- (*%E *)
- (*%F LongAddr *)
- Attr = frame+6; FNLen = frame+4; FNOfs = frame+2;
- RetSize = 6
- (*%E *)
- push bp; mov bp,sp
- (*%E *)
- (*%T RegParam *) (* AX=Attr; BX=Len; CX=Ofs; DX=Seg *)
- RetSize = 0
- (*%E *)
- push si
- push dx
- (*%T LongAddr *)
- push ds
- (*%T RegParam *)
- mov ds, dx
- (*%E *)
- (*%F RegParam *)
- lds si, [bp][FNOfs]
- (*%E *)
- (*%E *)
- (*%F LongAddr *)
- (*%F RegParam *)
- mov si, [bp][FNOfs]
- (*%E *)
- (*%E *)
- (*%T RegParam *)
- mov si, cx
- mov cx, bx
- push ax (* Save Attr *)
- (*%E *)
- (*%F RegParam *)
- mov cx, [bp][FNLen]
- (*%E *)
- call near FioAsm$ToPath
- (*%T RegParam *)
- pop cx
- (*%E *)
- (*%F RegParam *)
- mov cx, [bp][Attr]
- (*%E *)
- mov ax, 4301H
- int 21H
- call near FioAsm$SetIorBool
- (*%T LongAddr *)
- pop ds
- (*%E *)
- pop dx
- pop si
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
- select _TEXT
-
- extrn FioAsm@IOR
- extrn FioAsm$ToPath
-
- public FioAsm$GetFileAttribute : (* AX=Len; BX=Ofs; CX=Seg *)
- (*%T RegParam *)
- RetSize = 0
- (*%E *)
- (*%F RegParam *)
- (*%T LongAddr *)
- FNLen = frame+6; FNSeg = frame+4; FNOfs = frame+2; RetSize = 6
- (*%E *)
- (*%F LongAddr *)
- FNLen = frame+4; FNOfs = frame+2; RetSize = 4
- (*%E *)
- push bp; mov bp,sp
- (*%E *)
- push si
- push dx
- push cx
- (*%T LongAddr *)
- push ds
- (*%F RegParam *)
- lds si, [bp][FNOfs]
- (*%E *)
- (*%T RegParam *)
- mov ds, cx
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- (*%F LongAddr *)
- mov si, [bp][FNOfs]
- (*%E *)
- mov cx, [bp][FNLen]
- (*%E *)
- (*%T RegParam *)
- mov si, bx
- mov cx, ax
- (*%E *)
- call near FioAsm$ToPath
- mov ax, 4300H
- int 21H
- jnc GAtOK
- mov cs:[FioAsm@IOR],ax (* error is in ax *)
- mov ax, 40H (* attribute = ioerror *)
- jmp GAtRet
- GAtOK:
- mov ax, cx (* return attributes *)
- GAtRet:
- (*%T LongAddr *)
- pop ds
- (*%E *)
- pop cx
- pop dx
- pop si
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
- select _TEXT
-
- extrn FioAsm@IOR
-
- public FioAsm$FileTime :
- (*%F RegParam *)
- Fi = frame+2;
- RetSize = 2
- push bp; mov bp,sp
- mov bx, [bp][Fi]
- (*%E *)
- (*%T RegParam *)
- (* AX= handle*)
- RetSize = 0
- mov bx, ax
- (*%E *)
- mov ax, 5700H
- int 21H
- jnc TimeOK
- xor ax, ax (* we goofed; no time *)
- xor dx, dx
- mov cs:[FioAsm@IOR],ax (* error is in ax *)
- jmp TimeRet
- TimeOK:
- mov ax, cx (* return low byte in ax; high is in dx already *)
- TimeRet:
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- extrn FioAsm$SetIorBool
-
- public FioAsm$SetFileTime :
- (*%F RegParam *)
- Fi = frame+6; HiTime = frame+4; LoTime = frame+2;
- RetSize = 6
- push bp; mov bp,sp
- push dx
- mov bx, [bp][Fi]
- mov cx, [bp][LoTime]
- mov dx, [bp][HiTime]
- (*%E *)
- (*%T RegParam *)
- (*AX=handle; BX=LoTime; CX=HiTime*)
- RetSize = 0
- push dx
- mov dx, cx (* HiTime *)
- mov cx, bx (* LoTime *)
- mov bx, ax (* handle *)
- (*%E *)
- mov ax, 5701H
- int 21H
- call near FioAsm$SetIorBool
- pop dx
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- public FioAsm$DecodeFileTime :
- DYear = 0; DMonth = 2; DDay = 4; DHours = 6; DMins = 8; DSecs = 10;
- (*%F RegParam *)
- (*%T LongAddr *)
- PackedDate = frame+8; PackedTime = frame+6;
- DTSeg = frame+4; DTOfs = frame+2;
- RetSize = 8
- (*%E *)
- (*%F LongAddr *)
- PackedDate = frame+6; PackedTime = frame+4; DTOfs = frame+2;
- (*%E *)
- RetSize = 6
- push bp; mov bp,sp
- (*%E *)
- (*%T RegParam *)
- (* AX=PackedDate; BX=PackedTime CX = DTOfs; DX = DTSeg *)
- RetSize = 0
- xchg ax, bx
- (*%E *)
- push di
- push dx
- (*%T LongAddr *)
- push ds
- (*%T RegParam *)
- mov ds, dx
- (*%E *)
- (*%F RegParam *)
- lds di, [bp][DTOfs]
- (*%E *)
- (*%E *)
- (*%F LongAddr *)
- (*%F RegParam *)
- mov di, [bp][DTOfs]
- (*%E *)
- (*%E *)
- (*%T RegParam *)
- mov di, cx
- (*%E *)
- (*%F RegParam *)
- mov ax, [bp][PackedDate]
- (*%E *)
- mov dx, ax (* save AX = packed date *)
- and ax, 1FH
- mov [di][DDay], ax
- mov ax, dx (* retrieve packed date *)
- mov cx, 5
- shr ax, cx
- mov dx, ax (* save AX *)
- and ax, 0FH
- mov [di][DMonth], ax
- mov ax, dx (* retrieve *)
- mov cx, 4
- shr ax, cx
- add ax, 1980
- mov [di][DYear], ax
- (*%T RegParam *)
- mov ax, bx (* packed time *)
- (*%E *)
- (*%F RegParam *)
- mov ax, [bp][PackedTime]
- mov bx, ax (* save packed time *)
- (*%E *)
- and ax, 1FH
- shl ax, 1
- mov [di][DSecs], ax
- mov ax, bx (* packed time *)
- mov cx, 5
- shr ax, cx
- mov bx, ax
- and ax, 3FH
- mov [di][DMins], ax
- mov ax, bx
- mov cx, 6
- shr ax, cx
- mov [di][DHours], ax
- (*%T LongAddr *)
- pop ds
- (*%E *)
- pop dx
- pop di
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- public FioAsm$EncodeFileTime :
- Year = frame+2; Month = frame+4; Day = frame+6;
- Hours = frame+8; Mins = frame+10; Secs = frame+12
- push bp; mov bp,sp
- mov ax, [bp][Year]
- sub ax, 1980
- mov cx, 4
- shl ax, cx
- add al, [bp][Month]
- mov cx, 5
- shl ax, cx
- add al, [bp][Day]
- mov dx, ax
- mov ax, [bp][Hours]
- mov cx, 6
- shl ax, cx
- add al, [bp][Mins]
- mov cx, 5
- shl ax, cx
- mov bx, ax
- mov ax, [bp][Secs]
- shr ax, 1
- add ax, bx
- pop bp
- (*%F sameCS *)
- ret far 12
- (*%E *)
- (*%T sameCS *)
- ret near 12
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- public FioAsm$GetDir :
- (*%F RegParam *)
- (*%T LongAddr *)
- GDrive = frame+8; GDLen = frame+6; GDSeg = frame+4; GDOfs = frame+2;
- RetSize = 8
- (*%E *)
- (*%F LongAddr *)
- GDrive = frame+6; GDLen = frame+4; GDOfs = frame+2;
- RetSize = 6
- (*%E *)
- push bp; mov bp,sp
- (*%E *)
- (*%T RegParam *)
- (* AX=Drive; BX=Len; DX=Seg; CX=Ofs *)
- RetSize = 0
- (*%E *)
- push si
- push dx
- (*%T LongAddr *)
- push ds
- (*%T RegParam *)
- mov ds, dx
- (*%E *)
- (*%F RegParam *)
- lds si, [bp][GDOfs]
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- (*%F LongAddr *)
- mov si, [bp][GDOfs]
- (*%E *)
- mov dl, [bp][GDrive]
- (*%E *)
- (*%T RegParam *)
- mov si, cx
- mov dl, ax
- (*%E *)
- mov ah, 47H (* getdir *)
- int 21H
- jnc GDRet
- mov byte [si], 0 (* set string = 0C *)
- GDRet:
- (*%T LongAddr *)
- pop ds
- (*%E *)
- pop dx
- pop si
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- extrn FioAsm$SetIorBool
- extrn FioAsm$ToPath
-
- public FioAsm$Erase :
- mov ah, 41H (* erase file; length in AL *)
- jmp Act
-
- public FioAsm$RmDir :
- mov ah, 3AH (* rmDir; length in AL *)
- jmp Act
-
- public FioAsm$MkDir :
- mov ah, 39H (* mkDir; length in AL *)
- jmp Act
-
- public FioAsm$ChDir :
- mov ah, 3BH (* chDir; length in AL *)
-
- Act: (* AX= Len; CX=Seg; BX=Ofs *)
- (*%F RegParam *)
- (*%T LongAddr *)
- ActLen = frame+6; ActNamSeg = frame+4; ActNamOfs = frame+2;
- RetSize = 6
- (*%E *)
- (*%F LongAddr *)
- ActLen = frame+4; ActNamOfs = frame+2;
- RetSize = 4
- (*%E *)
- push bp; mov bp,sp
- (*%E *) (* RegParam *)
- push si
- push dx
- (*%T LongAddr *)
- push ds
- (*%T RegParam *)
- mov ds, cx
- (*%E *)
- (*%F RegParam *)
- lds si, [bp][ActNamOfs]
- (*%E *)
- (*%E *)
- (*%T RegParam *)
- RetSize = 0
- mov cl, al
- xor ch, ch
- mov si, bx
- (*%E *)
- (*%F RegParam *)
- (*%F LongAddr *)
- mov si, [bp][ActNamOfs]
- (*%E *)
- mov cx, [bp][ActLen]
- (*%E *)
- call near FioAsm$ToPath
- int 21H
- call near FioAsm$SetIorBool
- (*%T LongAddr *)
- pop ds
- (*%E *)
- pop dx
- pop si
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
- select _TEXT
-
- extrn FioAsm@IOR
-
- public FioAsm$Seek :
- (*%T RegParam *)
- (* AX=handle; CX=SeekHi; BX=SeekLo *)
- (*%F LongAddr *) (*SeekOKOfs = DX *)
- RetSize = 0 (* calling procedure pops *)
- (*%E *)
- (*%T LongAddr *)
- SeekOKSeg = frame+4; SeekOKOfs = frame+2
- RetSize = 4
- push bp; mov bp,sp
- push dx
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- (*%T LongAddr *)
- SeekFile = frame+10; SeekHi = frame+8; SeekLo = frame+6;
- SeekOKSeg = frame+4; SeekOKOfs = frame+2
- RetSize = 10
- (*%E *)
- (*%F LongAddr *)
- SeekFile = frame+8; SeekHi = frame+6; SeekLo = frame+4; SeekOKOfs = frame+2
- RetSize = 8
- (*%E *)
- push bp; mov bp,sp
- push dx
- (*%E *)
- push di;
- (*%T LongAddr *)
- push ds
- lds di, [bp][SeekOKOfs]
- (*%E *)
- (*%F LongAddr *)
- (*%F RegParam *)
- mov di, [bp][SeekOKOfs]
- (*%E *)
- (*%T RegParam *)
- mov di, dx
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- mov dx, [bp][SeekLo]
- mov cx, [bp][SeekHi]
- mov bx, [bp][SeekFile]
- (*%E *)
- (*%T RegParam *)
- mov dx, bx (* cx already = seek high *)
- mov bx, ax
- (*%E *)
- mov ax, 4200H (* seek absolute *)
- int 21H
- jnc SeekGood
- mov cs:[FioAsm@IOR],ax (* error is in ax *)
- mov byte [di],0 (* OK false *)
- jmp SeekRet
- SeekGood:
- mov byte [di],1
- SeekRet:
- (*%T LongAddr *)
- pop ds
- (*%E *)
- pop di
- (*%T RegParam *)
- (*%T LongAddr *)
- pop dx
- pop bp
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- pop dx
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
- select _TEXT
-
- extrn FioAsm@IOR
-
- public FioAsm$SeekRel :
- (*%T RegParam *)
- (* AX=handle; CX=SeekHi; BX=SeekLo *)
- (*%F LongAddr *) (* SeekOKOfs = DX *)
- RetSize = 0 (* calling procedure pops *)
- (*%E *)
- (*%T LongAddr *)
- SeekOKSeg = frame+4; SeekOKOfs = frame+2
- RetSize = 4
- push bp; mov bp,sp
- push dx
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- (*%T LongAddr *)
- SeekFile = frame+10; SeekHi = frame+8; SeekLo = frame+6;
- SeekOKSeg = frame+4; SeekOKOfs = frame+2
- RetSize = 10
- (*%E *)
- (*%F LongAddr *)
- SeekFile = frame+8; SeekHi = frame+6; SeekLo = frame+4; SeekOKOfs = frame+2
- RetSize = 8
- (*%E *)
- push bp; mov bp,sp
- push dx
- (*%E *)
- push di;
- (*%T LongAddr *)
- push ds
- lds di, [bp][SeekOKOfs]
- (*%E *)
- (*%F LongAddr *)
- (*%F RegParam *)
- mov di, [bp][SeekOKOfs]
- (*%E *)
- (*%T RegParam *)
- mov di, dx
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- mov dx, [bp][SeekLo]
- mov cx, [bp][SeekHi]
- mov bx, [bp][SeekFile]
- (*%E *)
- (*%T RegParam *)
- mov dx, bx (* cx already = seek high *)
- mov bx, ax
- (*%E *)
- mov ax, 4201H (* seek relative *)
- int 21H
- jnc SeekRelGood
- mov cs:[FioAsm@IOR],ax (* error is in ax *)
- mov byte [di],0 (* OK false *)
- jmp SeekRelRet
- SeekRelGood:
- mov byte [di],1
- SeekRelRet:
- (*%T LongAddr *)
- pop ds
- (*%E *)
- pop di
- (*%T RegParam *)
- (*%T LongAddr *)
- pop dx
- pop bp
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- pop dx
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
- select _TEXT
-
- extrn FioAsm@IOR
-
- public FioAsm$GetPos :
- (*%T RegParam *)
- RetSize = 0 (*AX=handle; BX=Ofs; CX=Seg *)
- (*%E *)
- (*%F RegParam *)
- (*%T LongAddr *)
- GetFile = frame + 6; GetOKSeg = frame + 4; GetOKOfs = frame + 2
- RetSize = 6
- (*%E *)
- (*%F LongAddr *)
- GetFile = frame + 4; GetOKOfs = frame + 2
- RetSize = 4
- (*%E *)
- push bp; mov bp,sp
- (*%E *)
- push di;
- (*%T LongAddr *)
- push ds
- (*%T RegParam *)
- mov ds, cx
- (*%E *)
- (*%F RegParam *)
- lds di, [bp][GetOKOfs]
- (*%E *)
- (*%E *)
- (*%F LongAddr *)
- (*%F RegParam *)
- mov di, [bp][GetOKOfs]
- (*%E *)
- (*%E *)
- (*%T RegParam *)
- mov di, bx
- mov bx,ax
- (*%E *)
- (*%F RegParam *)
- mov bx, [bp][GetFile]
- (*%E *)
- xor dx,dx (* no offset *)
- xor cx,cx
- mov ax, 4201H (* seek relative *)
- int 21H
- jnc GetGood
- mov cs:[FioAsm@IOR],ax (* error is in ax *)
- mov byte [di],0 (* OK false *)
- jmp GetRet
- GetGood:
- mov byte [di],1
- GetRet:
- (*%T LongAddr *)
- pop ds
- (*%E *)
- pop di
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
- select _TEXT
-
- extrn FioAsm@IOR
-
- public FioAsm$SeekEOF :
- (*%T RegParam *)
- RetSize = 0 (*AX=handle; BX=Ofs; CX=Seg *)
- (*%E *)
- (*%F RegParam *)
- (*%T LongAddr *)
- SEOFFile = frame + 6; SEOFOKSeg = frame + 4; SEOFOKOfs = frame + 2
- RetSize = 6
- (*%E *)
- (*%F LongAddr *)
- SEOFFile = frame + 4; SEOFOKOfs = frame + 2
- RetSize = 4
- (*%E *)
- push bp; mov bp,sp
- (*%E *)
- push di;
- push dx
- (*%T LongAddr *)
- push ds
- (*%T RegParam *)
- mov ds, cx
- (*%E *)
- (*%F RegParam *)
- lds di, [bp][SEOFOKOfs]
- (*%E *)
- (*%E *)
- (*%F LongAddr *)
- (*%F RegParam *)
- mov di, [bp][SEOFOKOfs]
- (*%E *)
- (*%E *)
- (*%T RegParam *)
- mov di, bx
- mov bx,ax
- (*%E *)
- (*%F RegParam *)
- mov bx, [bp][SEOFFile]
- (*%E *)
- xor dx,dx (* no offset *)
- xor cx,cx
- mov ax, 4202H (* seek EOF *)
- int 21H
- jnc SEOFGood
- mov cs:[FioAsm@IOR],ax (* error is in ax *)
- mov byte [di],0 (* OK false *)
- jmp SEOFRet
- SEOFGood:
- mov byte [di],1
- SEOFRet:
- (*%T LongAddr *)
- pop ds
- (*%E *)
- pop dx
- pop di
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); segment _BSS(BSS, 28H); group DGROUP(_BSS)
- select _TEXT
-
- extrn FioAsm@IOR
-
- public FioAsm$EOF : (*AX=handle; BX=Ofs; CX=Seg *)
- (*%T RegParam *)
- RetSize = 0 (*AX=handle; BX=Ofs; CX=Seg *)
- (*%E *)
- (*%F RegParam *)
- (*%T LongAddr *)
- EofFile = frame + 6; EofOKSeg = frame + 4; EofOKOfs = frame + 2
- RetSize = 6
- (*%E *)
- (*%F LongAddr *)
- EofFile = frame + 4; EofOKOfs = frame + 2
- RetSize = 4
- (*%E *)
- push bp; mov bp,sp
- (*%E *)
- push di;
- push dx
- (*%T LongAddr *)
- push ds
- (*%T RegParam *)
- mov ds, cx
- (*%E *)
- (*%F RegParam *)
- lds di, [bp][EofOKOfs]
- (*%E *)
- (*%E *)
- (*%F LongAddr *)
- (*%F RegParam *)
- mov di, [bp][EofOKOfs]
- (*%E *)
- (*%E *)
- (*%T RegParam *)
- mov di, bx
- mov bx,ax
- (*%E *)
- (*%F RegParam *)
- mov bx, [bp][EofFile]
- (*%E *)
- mov ax, 4406H (* device status, input *)
- int 21H
- jnc EOFgood
- mov cs:[FioAsm@IOR],ax (* error is in ax *)
- mov ax,1 (* set TRUE, just in case *)
- mov byte ds:[di],0 (* OK false *)
- jmp EofRet
- EOFgood:
- not al (* reverse TRUE, FALSE *)
- and ax,1 (* reset all but last bit *)
- mov byte ds:[di],1 (* OK true *)
- EofRet:
- (*%T LongAddr *)
- pop ds
- (*%E *)
- pop dx
- pop di
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- extrn FioAsm$ToPath
-
- public FioAsm$ReadFirstEntry :
- (*%T RegParam *)
- (*%T LongAddr *)
- (* AX=R1Len; BX=R1Ofs; CX=R1Seg; DX= R1Attr *)
- D1Seg = frame+4; D1Ofs = frame+2;
- RetSize = 4 (* calling procedure pops *)
- push bp; mov bp,sp
- push dx
- (*%E *)
- (*%F LongAddr *) (*AX=R1Len; BX=R1Ofs; CX= R1Attr DX= D1Ofs *)
- RetSize = 0 (* calling procedure pops *)
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- (*%T LongAddr *)
- R1Len = frame+12; R1Seg = frame+10; R1Ofs = frame+8
- R1Attr = frame+6; D1Seg = frame+4; D1Ofs = frame+2;
- RetSize = 12
- (*%E *)
- (*%F LongAddr *)
- R1Len = frame+8; R1Ofs = frame+6; R1Attr = frame+4; D1Ofs = frame+2;
- RetSize = 8
- (*%E *)
- push bp; mov bp,sp
- push dx
- (*%E *)
- (*%T LongAddr *)
- push ds;
- (*%E *)
- push di; push si
- (*%T RegParam *)
- (*%T LongAddr *)
- push dx (* save attrib *)
- (*%E *)
- (*%F LongAddr *)
- push cx (* save attrib *)
- (*%E *)
- (*%E *)
- (*%T LongAddr *)
- lds dx, [bp][D1Ofs]
- (*%E *)
- (*%F LongAddr *)
- (*%F RegParam *)
- mov dx, [bp][D1Ofs]
- (*%E *)
- (*%E *)
- mov ah, 1AH (* set DTA to D *)
- int 21H
- (*%T RegParam *)
- (*%T LongAddr *)
- mov ds, cx
- (*%E *)
- mov si,bx
- mov cl,al (* get buffer length *)
- xor ch,ch (* with no trash in upper register *)
- (*%E *)
- (*%F RegParam *)
- (*%T LongAddr *)
- lds si,[bp][R1Ofs]
- (*%E *)
- (*%F LongAddr *)
- mov si,[bp][R1Ofs]
- (*%E *)
- mov cx,[bp][R1Len] (* get buffer length *)
- (*%E *)
- call near FioAsm$ToPath
- mov ah, 4EH (* read first *)
- (*%T RegParam *)
- pop cx (* bet attribute *)
- (*%E *)
- (*%F RegParam *)
- mov cx, [bp][R1Attr]
- (*%E *)
- int 21H
- jnc R1OK
- xor ax,ax (* false *)
- jmp R1Ret
- R1OK:
- mov ax, 1
- R1Ret:
- pop si; pop di
- (*%T LongAddr *)
- pop ds;
- (*%E *)
- (*%T RegParam *)
- (*%T LongAddr *)
- pop dx
- pop bp
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- pop dx
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- public FioAsm$ReadNextEntry :
- (*%T RegParam *)
- RetSize = 0 (* BX=Seg; AX=Ofs *)
- (*%E *)
- (*%F RegParam *)
- D2Seg = frame+4; D2Ofs = frame+2
- (*%T LongAddr *)
- RetSize = 4
- (*%E *)
- (*%F LongAddr *)
- RetSize = 2
- (*%E *)
- push bp; mov bp,sp
- (*%E *)
- push dx
- (*%T LongAddr *)
- push ds
- (*%T RegParam *)
- mov ds, bx
- (*%E *)
- (*%F RegParam *)
- lds dx, [bp][D2Ofs]
- (*%E *)
- (*%E *)
- (*%F LongAddr *)
- (*%F RegParam *)
- mov dx, [bp][D2Ofs]
- (*%E *)
- (*%E *)
- (*%T RegParam *)
- mov dx, ax
- (*%E *)
- mov ah, 1AH (* set DTA to D *)
- int 21H
- mov ah, 4FH (* read next *)
- int 21H
- jnc R2OK
- xor ax,ax (* false *)
- jmp R2Ret
- R2OK:
- mov ax, 1
- R2Ret:
- (*%T LongAddr *)
- pop ds;
- (*%E *)
- pop dx
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- public FioAsm$SetDTA:
- (*%T RegParam *)
- RetSize = 0 (*BX=Seg; AX=Ofs *)
- (*%E *)
- (*%F RegParam *)
- DTASeg = frame+4; DTAOfs = frame+2
- (*%T LongAddr *)
- RetSize = 4
- (*%E *)
- (*%F LongAddr *)
- RetSize = 2
- (*%E *)
- push bp; mov bp,sp
- (*%E *)
- push dx
- (*%T LongAddr *)
- push ds
- (*%T RegParam *)
- mov ds, bx
- (*%E *)
- (*%F RegParam *)
- lds dx, [bp][DTAOfs]
- (*%E *)
- (*%E *)
- (*%F LongAddr *)
- (*%F RegParam *)
- mov dx, [bp][DTAOfs]
- (*%E *)
- (*%E *)
- (*%T RegParam *)
- mov dx, ax
- (*%E *)
- mov ah, 1AH (* set DTA to D *)
- int 21H
- (*%T LongAddr *)
- pop ds
- (*%E *)
- pop dx
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- (* NO ARGUMENTS *)
- public FioAsm$GetDTA:
- (*%T LongAddr *)
- push ds;
- (*%E *)
- push bx
- mov ah, 2FH
- int 21H
- (*%T LongAddr *)
- mov dx,es
- (*%E *)
- mov ax, bx
- pop bx
- (*%T LongAddr *)
- pop ds
- (*%E *)
- (*%F sameCS *)
- ret far 0
- (*%E *)
- (*%T sameCS *)
- ret near 0
- (*%E *)
-
- section; segment _TEXT(CODE,28H); select _TEXT
-
- public FioAsm$DiskFree:
- (*%T RegParam *)
- RetSize = 0 (* AX=dr; CX=seg; BX=ofs *)
- (*%E *)
- (*%F RegParam *)
- (*%T LongAddr *)
- dr = frame+6; BPCseg = frame+4; BPCofs = frame+2
- RetSize = 6
- (*%E *)
- (*%F LongAddr *)
- dr = frame+4; BPCofs = frame+2
- RetSize = 4
- (*%E *)
- push bp; mov bp,sp
- (*%E *)
- push si;
- (*%T LongAddr *)
- push ds
- (*%T RegParam *)
- mov ds, cx
- (*%E *)
- (*%F RegParam *)
- lds si,[bp][BPCofs]
- (*%E *)
- (*%E *)
- (*%F RegParam *)
- (*%F LongAddr *)
- mov si,[bp][BPCofs]
- (*%E *)
- mov dl, [bp][dr] (* load drive *)
- (*%E *)
- (*%T RegParam *)
- mov si,bx
- mov dl, ax (* drive *)
- (*%E *)
- mov ah, 36H (* get disk data *)
- int 21H
- cmp ax, 0FFFFH
- jne OKdr
- xor ax, ax
- OKdr:
- mul cx
- mov [si],ax
- mul bx
- (*%T LongAddr *)
- pop ds
- (*%E *)
- pop si
- (*%F RegParam *)
- pop bp
- (*%E *)
- (*%F sameCS *)
- ret far RetSize
- (*%E *)
- (*%T sameCS *)
- ret near RetSize
- (*%E *)
-
- end
-